function res = GetFIDXe131Signal(obj, duration, varargin)
    p=inputParser;
    p.addRequired('duration', @(x) x>0);
    p.addParameter('rate', 2e3, @(x) x>0);
    p.addParameter('targetResolution', 1e-3, @(x) x>0.0)
    p.addParameter('guessFrequency', 75.0, @(x) x>0.0);
    p.addParameter('initAmplitude', 0.100, @(x) x>0.0);
    p.addParameter('isReport', false, @islogical);
    p.addParameter('description', 'normal', @ischar);
    p.parse(duration, varargin{:});

    %%
    obj.setParametricMagnetometer('isLockTransverseField', true);
    obj.setNMR('frequency131', p.Results.guessFrequency, 'frequency129', p.Results.guessFrequency*3.37340);
    obj.by.setDriver( obj.ziSlave.LockInChannel(2).setOscillator(2) );
    obj.by.setAC('frequency', p.Results.guessFrequency, 'amplitude', p.Results.initAmplitude, 'range', 10.0); pause(5.0);
    obj.ziSlave.disableOutAmplitude();pause(0.1);
    
    sg = MeasurementComponent.Signal.SignalGroup('Xe131FIDGroup');
    sg.subscribe_signal(obj.bTrans, ziDemodTime.X, [2, 1, 1]);
    sg.subscribe_signal(obj.Xe131,  ziDemodTime.R, [2, 1, 2]);
    res.signal = sg.getDemodSignal(duration, 'rate', p.Results.rate);

    %%
    res.timestamp = datetime('now');
    fidSignal = res.signal.getNodeData(1);
    res.fidEnvelope = res.signal.getNodeData(2);
    
    [xData, yData] = prepareCurveData( res.fidEnvelope.x, res.fidEnvelope.y );
    ft = fittype( 'exp1' );
    opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
    opts.Display = 'Off';
    opts.StartPoint = [max(res.fidEnvelope.y) -mean(res.fidEnvelope.x)];

    res.fitting.envelope = res.fidEnvelope;
    [res.fitting.result, res.fitting.gof] = fit( xData, yData, ft, opts );
    res.fitting.amplitude = res.fitting.result.a;
    res.fitting.tau = abs(1.0/res.fitting.result.b);
    
    %%
    L = 2^nextpow2(p.Results.rate/p.Results.targetResolution);
    fList= (0:L/2)*p.Results.rate/L; Y = fft(fidSignal.y, L);
    P2 = abs(Y/L); P1 = P2(1:L/2+1); P1(2:end-1) = 2*P1(2:end-1);
    
    res.fft.value = P1;
    res.fft.fList = fList;
    idx = (fList > p.Results.guessFrequency-3.0 & fList < p.Results.guessFrequency+3.0);
    [res.fft.peak, res.fft.center, res.fft.width] = findpeaks(res.fft.value(idx), res.fft.fList(idx), 'NPeaks', 1, 'SortStr', 'descend');
    
    obj.Xe131FIDSignal = res;
    fig = obj.PlotFIDXe131Signal();
    
    %%
    if p.Results.isReport
        getReporter;
        rpt.NewRecord(['Xe131FID_' p.Results.description]);
        rpt.AppendFigure(fig, sprintf('Xe131FID %s', p.Results.description));
    end
    getSession;
    sess.addData('Xe131FID', res, p.Results.description);
end